<?php
namespace App\Libs\MarketplaceWebServiceProducts;
use App\Libs\MarketplaceWebServiceProducts\Model\GetMatchingProductForIdRequest;
use App\Libs\MarketplaceWebServiceProducts\Model\GetMatchingProductRequest;
use App\Libs\MarketplaceWebServiceProducts\Model\GetMyPriceForASINRequest;
use App\Libs\MarketplaceWebServiceProducts\Model\GetMyPriceForSKURequest;
use App\Libs\MarketplaceWebServiceProducts\Model\GetProductCategoriesForASINRequest;
use App\Libs\MarketplaceWebServiceProducts\Model\GetProductCategoriesForSKURequest;
use App\Libs\MarketplaceWebServiceProducts\Model\ListMatchingProductsRequest;

class ProductsMws{
    private static $_instance = null;

    private $_fields = ['SellerId',
                        'MWSAuthToken',
                        'MarketplaceId',
                        'Query',
                        'QueryContextId',
                        'IdType',
                        'IdList',
                        'ASINList',
                        'SellerSKUList',
                        'ASIN',
                        'SellerSKU'];

    public static function getInit(){
        if(!is_object(self::$_instance)){
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    /**
     * 根据搜索查询，返回商品及其属性列表。
     * @param array $con
     * @return array
     */
    public function listMatchingProducts($con = array())
    {
        $request = $this->_getRequest(new ListMatchingProductsRequest(),$con);
        if (!$request instanceof ListMatchingProductsRequest) {
            $request = new ListMatchingProductsRequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'ListMatchingProducts';
        return $parameters;
    }

    /**
     * 根据 ASIN 值列表，返回商品及其属性列表
     * 此操作最多会返回十件商品
     * 应尽可能使用 GetMatchingProductForId 操作来代替 GetMatchingProduct 操作
     * @param array $con
     * @return array
     */
    public function getMatchingProduct($con = array())
    {
        $request = $this->_getRequest(new GetMatchingProductRequest(),$con);
        if (!($request instanceof GetMatchingProductRequest)) {
            $request = new GetMatchingProductRequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'GetMatchingProduct';
        return $parameters;
    }

    /**
     * 根据 ASIN、GCID、SellerSKU、UPC、EAN、ISBN 和 JAN，返回商品及其属性列表。
     * 可能的商品编号包括：ASIN、GCID、SellerSKU、UPC、EAN、ISBN 和 JAN。
     * @param array $con
     * @return array
     */
    public function getMatchingProductForId($con = array())
    {
        $request = $this->_getRequest(new GetMatchingProductForIdRequest(),$con);
        if (!($request instanceof GetMatchingProductForIdRequest)) {
            $request = new GetMatchingProductForIdRequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'GetMatchingProductForId';
        return $parameters;
    }

    /**
     * 根据 ASIN，返回您自己的商品的价格信息。
     * 使用 MarketplaceId 和 ASIN 来唯一标识一件商品，且不会返回 SKUIdentifier 元素。
     * @param array $con
     * @return array
     */
    public function getMyPriceForASIN($con = array())
    {
        $request = $this->_getRequest(new GetMyPriceForASINRequest(),$con);
        if (!$request instanceof GetMyPriceForASINRequest) {
            $request = new GetMyPriceForASINRequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'GetMyPriceForASIN';
        return $parameters;
    }

    /**
     * 根据 SellerSKU，返回您自己的商品的价格信息。
     * @param array $con
     * @return array
     */
    public function getMyPriceForSKU($con = array())
    {
        $request = $this->_getRequest(new GetMyPriceForSKURequest(),$con);
        if (!($request instanceof GetMyPriceForSKURequest)) {
            $request = new GetMyPriceForSKURequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'GetMyPriceForSKU';
        return $parameters;
    }

    /**
     * 根据 ASIN，返回商品所在的商品分类。
     * 使用 MarketplaceId 和 ASIN 唯一标识商品。
     * @param array $con
     * @return array
     */
    public function getProductCategoriesForASIN($con = array())
    {
        $request = $this->_getRequest(new GetProductCategoriesForASINRequest(),$con);
        if (!$request instanceof GetProductCategoriesForASINRequest) {
            $request = new GetProductCategoriesForASINRequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'GetProductCategoriesForASIN';
        return $parameters;
    }

    /**
     * 根据 SellerSKU，返回商品所在的商品分类。
     * GetProductCategoriesForSKU 操作会返回商品的商品分类名称以及编码，包括商城根目录下的父分类。
     * @param array $con
     * @return array
     */
    public function getProductCategoriesForSKU($con = array())
    {
        $request = $this->_getRequest(new GetProductCategoriesForSKURequest(),$con);
        if (!$request instanceof GetProductCategoriesForSKURequest) {
            $request = new GetProductCategoriesForSKURequest($request);
        }
        $parameters = $request->toQueryParameterArray();
        $parameters['Action'] = 'GetProductCategoriesForSKU';
        return $parameters;
    }

    private function _getRequest($request,$con = array()) {
        foreach($con as $k=>$v){
            if($k&&in_array($k,$this->_fields)){
                $setter = "set$k";
                $request->$setter($v);
            }
        }
        return $request;
    }
}